package util

import (
	"net/http"
	"reflect"
	"strconv"
)

/*
flag 决定解析类型 1 multidata 2 www form data 3 query
v 为传入值（结构体），必须为指针（引用）
注意：并不能解析文件上传的data
*/
func FormParse(r *http.Request, v interface{}, flag int8) {
	if flag == 1 {
		r.ParseForm()
	}
	if flag == 2 {
		r.ParseMultipartForm(200000000)
	}
	vs := reflect.ValueOf(v).Elem()
	vt := reflect.TypeOf(v).Elem()
	for i := 0; i < vs.NumField(); i++ {

		fieldv := vs.Field(i)
		formName := vt.Field(i).Tag.Get("form")
		if len(formName) == 0 {
			continue
		}

		var values []string

		// form解析
		if flag == 1 || flag == 2 {

			fs, ok := r.Form[formName]
			if !ok {
				continue
			}
			values = fs
		}
		// query解析
		if flag == 3 {
			s := r.URL.Query().Get(formName)
			if len(s) == 0 {
				continue
			}
			values = append(values,s)
		}

		// 赋值
		switch fieldv.Kind() {
		case reflect.Int:

			vf, err := strconv.ParseInt(values[0], 10, 32)
			if err == nil {
				fieldv.SetInt(vf)
			}
		case reflect.Uint8:
			vf, err := strconv.ParseInt(values[0], 10, 8)
			if err == nil {
				fieldv.SetInt(vf)
			}
		case reflect.Int8:
			vf, err := strconv.ParseInt(values[0], 10, 8)
			if err == nil {
				fieldv.SetInt(vf)
			}

		case reflect.String:
			fieldv.SetString(values[0])

		case reflect.Bool:
			vf, err := strconv.ParseBool(values[0])
			if err == nil {
				fieldv.SetBool(vf)
			}

		case reflect.Float32:
			vf, err := strconv.ParseFloat(values[0], 32)
			if err == nil {
				fieldv.SetFloat(vf)
			}
		case reflect.Slice:

			newv := reflect.MakeSlice(fieldv.Type(), 0, len(values))
			ele:=newv.Elem()
			switch ele.Kind() {
			case reflect.Int:

			}
	    reflect.Copy(newv, fieldv)

	    fieldv.Set(newv)


		}

	}
}
